home *** CD-ROM | disk | FTP | other *** search
/ Mastering Internet Develo…oft ActiveX Technologies / Mastering Internet Development with ActiveX (1996)(Microsoft).iso / labs / lab06 / formdump / html.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-16  |  11.0 KB  |  470 lines

  1. // html.cpp - Some HTML authoring functions
  2.  
  3. #define WIN32_LEAN_AND_MEAN
  4. #include <windows.h>
  5. #include <httpext.h>
  6.  
  7. #include "html.h"
  8.  
  9. //
  10. // WriteString writes an ASCII string to the web browser
  11. //
  12.  
  13. void WriteString (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpsz)
  14.     {
  15.     DWORD dwBytesWritten;
  16.  
  17.     dwBytesWritten = lstrlen (lpsz);
  18.     pECB->WriteClient (pECB->ConnID, (PVOID) lpsz, &dwBytesWritten, 0);
  19.     }
  20.  
  21. //
  22. // HtmlCreatePage adds <HTML> and a title
  23. //
  24.  
  25. void HtmlCreatePage (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszTitle)
  26.     {
  27.     // IIS does this for us
  28.  
  29.     //WriteString (pECB, TEXT("Content-Type: text/html\r\n"));
  30.  
  31.     WriteString (pECB, TEXT("<HTML>\r\n\r\n"));
  32.  
  33.     if (lpszTitle)
  34.         {
  35.         WriteString (pECB, TEXT("<HEAD><TITLE>"));
  36.         HtmlWriteText (pECB, lpszTitle);
  37.         WriteString (pECB, TEXT("</TITLE></HEAD>\r\n\r\n"));
  38.         }
  39.  
  40.     WriteString (pECB, TEXT("<BODY>\r\n\r\n"));
  41.     }
  42.  
  43. void HtmlEndPage (EXTENSION_CONTROL_BLOCK *pECB)
  44.     {
  45.     WriteString (pECB, TEXT("</BODY>\r\n\r\n"));
  46.     WriteString (pECB, TEXT("</HTML>\r\n"));
  47.     }
  48.  
  49.  
  50. //
  51. // Heading tools
  52. //
  53.  
  54. void HtmlHeading (EXTENSION_CONTROL_BLOCK *pECB, int nHeading, 
  55.                   LPCTSTR lpszText)
  56.     {
  57.     HtmlBeginHeading (pECB, nHeading);
  58.     HtmlWriteText (pECB, lpszText);
  59.     HtmlEndHeading (pECB, nHeading);
  60.     }
  61.  
  62. void HtmlBeginHeading (EXTENSION_CONTROL_BLOCK *pECB, int nHeading)
  63.     {
  64.     TCHAR szCode[16];
  65.  
  66.     wsprintf (szCode, TEXT("<H%i>"), nHeading);
  67.     WriteString (pECB, szCode);
  68.     }
  69.  
  70. void HtmlEndHeading (EXTENSION_CONTROL_BLOCK *pECB, int nHeading)
  71.     {
  72.     TCHAR szCode[16];
  73.  
  74.     wsprintf (szCode, TEXT("</H%i>"), nHeading);
  75.     WriteString (pECB, szCode);
  76.     }
  77.  
  78. //
  79. // Text tools
  80. //
  81.  
  82. void HtmlWriteTextLine (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpsz)
  83.     {
  84.     HtmlWriteText (pECB, lpsz);
  85.     WriteString (pECB, TEXT("\r\n"));
  86.     }
  87.  
  88. void HtmlWriteText (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpsz)
  89.     {
  90.     TCHAR szBuf[1028];
  91.     int nLen;
  92.     int i;
  93.  
  94.     //
  95.     // Build up enough data to make call to WriteString
  96.     // worthwhile; convert special chars too.
  97.     //
  98.     nLen = 0;
  99.     for (i = 0 ; lpsz[i] ; i++)
  100.         {
  101.         if (lpsz[i] == TEXT('<'))
  102.             lstrcpy (&szBuf[nLen], TEXT("<"));
  103.         else if (lpsz[i] == TEXT('>'))
  104.             lstrcpy (&szBuf[nLen], TEXT(">"));
  105.         else if (lpsz[i] == TEXT('&'))
  106.             lstrcpy (&szBuf[nLen], TEXT("&"));
  107.         else if (lpsz[i] == TEXT('\"'))
  108.             lstrcpy (&szBuf[nLen], TEXT("""));
  109.         else
  110.             {
  111.             szBuf[nLen] = lpsz[i];
  112.             szBuf[nLen + 1] = 0;
  113.             }
  114.  
  115.         nLen += lstrlen (&szBuf[nLen]);
  116.  
  117.         if (nLen >= 1024)
  118.             {
  119.             WriteString (pECB, szBuf);
  120.             nLen = 0;
  121.             }
  122.         }
  123.  
  124.     if (nLen)
  125.         WriteString (pECB, szBuf);
  126.     }
  127.  
  128. void HtmlEndParagraph (EXTENSION_CONTROL_BLOCK *pECB)
  129.     {
  130.     WriteString (pECB, TEXT("<P>\r\n"));
  131.     }
  132.  
  133. //
  134. // HtmlHyperLink adds a hyptertext link.  lpszDoc is the destination
  135. // document, and lpszText is the display text.
  136. //
  137. // HtmlHyperLinkAndBookmark adds a hyperlink with a bookmark link.
  138. // HtmlBookmarkLink adds only a bookmark link.
  139. //
  140.  
  141. void HtmlHyperLink (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszDoc, LPCTSTR lpszText)
  142.     {
  143.     WriteString (pECB, TEXT("<A HREF=\""));
  144.     HtmlWriteText (pECB, lpszDoc);
  145.     WriteString (pECB, TEXT("\">"));
  146.     HtmlWriteText (pECB, lpszText);
  147.     WriteString (pECB, TEXT("</A>\r\n"));
  148.     }
  149.         
  150. void HtmlHyperLinkAndBookmark (EXTENSION_CONTROL_BLOCK *pECB, 
  151.                                LPCTSTR lpszDoc, LPCTSTR lpszBookmark,
  152.                                LPCTSTR lpszText)
  153.     {
  154.     WriteString (pECB, TEXT("<A HREF=\""));
  155.     if (lpszDoc)
  156.         HtmlWriteText (pECB, lpszDoc);
  157.     WriteString (pECB, TEXT("#"));
  158.     HtmlWriteText (pECB, lpszBookmark);
  159.     WriteString (pECB, TEXT("\">"));
  160.     HtmlWriteText (pECB, lpszText);
  161.     WriteString (pECB, TEXT("</A>\r\n"));
  162.     }
  163.  
  164. void HtmlBookmarkLink (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszBookmark,
  165.                        LPCTSTR lpszText)
  166.     {
  167.     HtmlHyperLinkAndBookmark (pECB, NULL, lpszBookmark, lpszText);
  168.     }
  169.  
  170. //
  171. // The following support list formatting.
  172. //
  173.  
  174. void HtmlBeginUnnumberedList (EXTENSION_CONTROL_BLOCK *pECB)
  175.     {
  176.     WriteString (pECB, TEXT("<UL>\r\n"));
  177.     }
  178.  
  179. void HtmlBeginListItem (EXTENSION_CONTROL_BLOCK *pECB)
  180.     {
  181.     WriteString (pECB, TEXT("<LI>"));
  182.     }
  183.  
  184. void HtmlEndUnnumberedList (EXTENSION_CONTROL_BLOCK *pECB)
  185.     {
  186.     WriteString (pECB, TEXT("</UL>"));
  187.     }
  188.  
  189. void HtmlBeginNumberedList (EXTENSION_CONTROL_BLOCK *pECB)
  190.     {
  191.     WriteString (pECB, TEXT("<OL>"));
  192.     }
  193.  
  194. void HtmlEndNumberedList (EXTENSION_CONTROL_BLOCK *pECB)
  195.     {
  196.     WriteString (pECB, TEXT("</OL>"));
  197.     }
  198.     
  199. void HtmlBeginDefinitionList (EXTENSION_CONTROL_BLOCK *pECB)
  200.     {
  201.     WriteString (pECB, TEXT("<DL>"));
  202.     }
  203.  
  204. void HtmlEndDefinitionList (EXTENSION_CONTROL_BLOCK *pECB)
  205.     {
  206.     WriteString (pECB, TEXT("</DL>"));
  207.     }
  208.  
  209. void HtmlDefinition (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszTerm,
  210.                      LPTSTR lpszDef)
  211.     {
  212.     int nStart, nEnd, nLen;
  213.     TCHAR tcHolder;
  214.  
  215.     WriteString (pECB, TEXT("<DT> "));
  216.     HtmlWriteText (pECB, lpszTerm);
  217.     WriteString (pECB, TEXT("\r\n"));
  218.     WriteString (pECB, TEXT("<DD> "));
  219.  
  220.     nStart = 0 ;
  221.     nLen = lstrlen (lpszDef);
  222.     do  {
  223.         nEnd = nStart + 70;
  224.         if (nEnd >= nLen)
  225.             {
  226.             HtmlWriteText (pECB, &lpszDef[nStart]);
  227.             WriteString (pECB, TEXT("\r\n"));
  228.             break;
  229.             }
  230.  
  231.         while (nEnd > nStart)
  232.             if (lpszDef[nEnd] == TEXT(' '))
  233.                 break;
  234.  
  235.         if (nEnd == nStart)
  236.             // too long!
  237.             nEnd = nStart + 70;
  238.  
  239.         // write defintion segment
  240.         tcHolder = lpszDef[nEnd];
  241.         lpszDef[nEnd] = 0;
  242.         HtmlWriteText (pECB, &lpszDef[nStart]);
  243.         WriteString (pECB, TEXT("\r\n"));
  244.         lpszDef[nEnd] = tcHolder;
  245.         nStart = nEnd;
  246.  
  247.         // skip excess whitespace
  248.         while (lpszDef[nStart] == TEXT(' '))
  249.             nStart++;
  250.  
  251.         // pretty formatting
  252.         if (nStart < nLen)
  253.             WriteString (pECB, TEXT("     "));
  254.         } while (nStart < nLen);
  255.     }
  256.         
  257. // For complex defintions
  258. void HtmlBeginDefinitionTerm (EXTENSION_CONTROL_BLOCK *pECB)
  259.     {
  260.     WriteString (pECB, TEXT("<DT>"));
  261.     }
  262.  
  263. void HtmlBeginDefinition (EXTENSION_CONTROL_BLOCK *pECB)
  264.     {
  265.     WriteString (pECB, TEXT("<DD>"));
  266.     }
  267.  
  268. //
  269. // Text formatting
  270. //
  271.  
  272. void HtmlBeginPreformattedText (EXTENSION_CONTROL_BLOCK *pECB)
  273.     {
  274.     WriteString (pECB, TEXT("<PRE>"));
  275.     }
  276.  
  277. void HtmlEndPreformattedText (EXTENSION_CONTROL_BLOCK *pECB)
  278.     {
  279.     WriteString (pECB, TEXT("</PRE>"));
  280.     }
  281.  
  282. void HtmlBeginBlockQuote (EXTENSION_CONTROL_BLOCK *pECB)
  283.     {
  284.     WriteString (pECB, TEXT("<BLOCKQUOTE>"));
  285.     }
  286.  
  287. void HtmlEndBlockQuote (EXTENSION_CONTROL_BLOCK *pECB)
  288.     {
  289.     WriteString (pECB, TEXT("</BLOCKQUOTE>"));
  290.     }
  291.  
  292. void HtmlBeginAddress (EXTENSION_CONTROL_BLOCK *pECB)
  293.     {
  294.     WriteString (pECB, TEXT("<ADDRESS>"));
  295.     }
  296.  
  297. void HtmlEndAddress (EXTENSION_CONTROL_BLOCK *pECB)
  298.     {
  299.     WriteString (pECB, TEXT("</ADDRESS>"));
  300.     }
  301.  
  302. void HtmlBeginDefine (EXTENSION_CONTROL_BLOCK *pECB)
  303.     {
  304.     WriteString (pECB, TEXT("<DFN>"));
  305.     }
  306.  
  307. void HtmlEndDefine (EXTENSION_CONTROL_BLOCK *pECB)
  308.     {
  309.     WriteString (pECB, TEXT("</DFN>"));
  310.     }
  311.  
  312. void HtmlBeginEmphasis (EXTENSION_CONTROL_BLOCK *pECB)
  313.     {
  314.     WriteString (pECB, TEXT("<EM>"));
  315.     }
  316.  
  317. void HtmlEndEmphasis (EXTENSION_CONTROL_BLOCK *pECB)
  318.     {
  319.     WriteString (pECB, TEXT("</EM>"));
  320.     }
  321.  
  322. void HtmlBeginCitation (EXTENSION_CONTROL_BLOCK *pECB)
  323.     {
  324.     WriteString (pECB, TEXT("<CITE>"));
  325.     }
  326.  
  327. void HtmlEndCitation (EXTENSION_CONTROL_BLOCK *pECB)
  328.     {
  329.     WriteString (pECB, TEXT("</CITE>"));
  330.     }
  331.  
  332. void HtmlBeginCode (EXTENSION_CONTROL_BLOCK *pECB)
  333.     {
  334.     WriteString (pECB, TEXT("<CODE>"));
  335.     }
  336.  
  337. void HtmlEndCode (EXTENSION_CONTROL_BLOCK *pECB)
  338.     {
  339.     WriteString (pECB, TEXT("</CODE>"));
  340.     }
  341.  
  342. void HtmlBeginKeyboard (EXTENSION_CONTROL_BLOCK *pECB)
  343.     {
  344.     WriteString (pECB, TEXT("<KBD>"));
  345.     }
  346.  
  347. void HtmlEndKeyboard (EXTENSION_CONTROL_BLOCK *pECB)
  348.     {
  349.     WriteString (pECB, TEXT("</KBD>"));
  350.     }
  351.  
  352. void HtmlBeginStatus (EXTENSION_CONTROL_BLOCK *pECB)
  353.     {
  354.     WriteString (pECB, TEXT("<SAMP>"));
  355.     }
  356.  
  357. void HtmlEndStatus (EXTENSION_CONTROL_BLOCK *pECB)
  358.     {
  359.     WriteString (pECB, TEXT("</SAMP>"));
  360.     }
  361.  
  362. void HtmlBeginStrong (EXTENSION_CONTROL_BLOCK *pECB)
  363.     {
  364.     WriteString (pECB, TEXT("<STRONG>"));
  365.     }
  366.  
  367. void HtmlEndString (EXTENSION_CONTROL_BLOCK *pECB)
  368.     {
  369.     WriteString (pECB, TEXT("</STRONG>"));
  370.     }
  371.  
  372. void HtmlBeginVariable (EXTENSION_CONTROL_BLOCK *pECB)
  373.     {
  374.     WriteString (pECB, TEXT("<VAR>"));
  375.     }
  376.  
  377. void HtmlEndVariable (EXTENSION_CONTROL_BLOCK *pECB)
  378.     {
  379.     WriteString (pECB, TEXT("</VAR>"));
  380.     }
  381.  
  382. void HtmlBold (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszText)
  383.     {
  384.     HtmlBeginBold (pECB);
  385.     HtmlWriteText (pECB, lpszText);
  386.     HtmlEndBold (pECB);
  387.     }
  388.  
  389. void HtmlBeginBold (EXTENSION_CONTROL_BLOCK *pECB)
  390.     {
  391.     WriteString (pECB, TEXT("<B>"));
  392.     }
  393.  
  394. void HtmlEndBold (EXTENSION_CONTROL_BLOCK *pECB)
  395.     {
  396.     WriteString (pECB, TEXT("</B>"));
  397.     }
  398.  
  399. void HtmlItalic (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszText)
  400.     {
  401.     HtmlBeginItalic (pECB);
  402.     HtmlWriteText (pECB, lpszText);
  403.     HtmlEndItalic (pECB);
  404.     }
  405.  
  406. void HtmlBeginItalic (EXTENSION_CONTROL_BLOCK *pECB)
  407.     {
  408.     WriteString (pECB, TEXT("<I>"));
  409.     }
  410.  
  411. void HtmlEndItalic (EXTENSION_CONTROL_BLOCK *pECB)
  412.     {
  413.     WriteString (pECB, TEXT("</I>"));
  414.     }
  415.  
  416. void HtmlFixed (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszText)
  417.     {
  418.     HtmlBeginFixed (pECB);
  419.     HtmlWriteText (pECB, lpszText);
  420.     HtmlEndFixed (pECB);
  421.     }
  422.  
  423. void HtmlBeginFixed (EXTENSION_CONTROL_BLOCK *pECB)
  424.     {
  425.     WriteString (pECB, TEXT("<TT>"));
  426.     }
  427.  
  428. void HtmlEndFixed (EXTENSION_CONTROL_BLOCK *pECB)
  429.     {
  430.     WriteString (pECB, TEXT("</TT>"));
  431.     }
  432.  
  433.  
  434. //
  435. // Line breaks and other formatting
  436. //
  437.  
  438. void HtmlLineBreak (EXTENSION_CONTROL_BLOCK *pECB)
  439.     {
  440.     WriteString (pECB, TEXT("<BR>\r\n"));
  441.     } 
  442.  
  443. void HtmlHorizontalRule (EXTENSION_CONTROL_BLOCK *pECB)
  444.     {
  445.     WriteString (pECB, TEXT("\r\n<HR>\r\n"));
  446.     }
  447.  
  448.  
  449. //
  450. // Images
  451. //
  452.  
  453. void HtmlImage (EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR lpszPicFile,
  454.                 LPCTSTR lpszAltText)
  455.     {
  456.     WriteString (pECB, TEXT("<IMG SRC = \""));
  457.     HtmlWriteText (pECB, lpszPicFile);
  458.     WriteString (pECB, TEXT("\""));
  459.     if (lpszAltText)
  460.         {
  461.         WriteString (pECB, TEXT(" ALT = \""));
  462.         HtmlWriteText (pECB, lpszAltText);
  463.         WriteString (pECB, TEXT("\""));
  464.         }
  465.     WriteString (pECB, TEXT(">\r\n"));
  466.     }
  467.  
  468.  
  469.  
  470.